package com.hand.wfive.loginAndVip;

import android.graphics.Color;
import android.util.Log;

import androidx.core.content.ContextCompat;
import androidx.lifecycle.MutableLiveData;

import com.hand.wfive.App;
import com.hand.wfive.BuildConfig;
import com.hand.wfive.R;
import com.hand.wfive.loginAndVip.model.MobileLoginModel;
import com.netease.nis.quicklogin.QuickLogin;
import com.netease.nis.quicklogin.helper.UnifyUiConfig;
import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener;
import com.netease.nis.quicklogin.listener.QuickLoginTokenListener;

/**
 * 本机号码一键登录
 */
public class MobileLogin {

    private static final String TAG = MobileLogin.class.getSimpleName();

    public static MobileLogin getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final MobileLogin INSTANCE = new MobileLogin();
    }

    private QuickLogin mQuickLogin;
    private long mPrefetchTime = 0L;
    private MobileLoginModel mModel;

    private final MutableLiveData<MobileLoginModel> mPrefetchLive = new MutableLiveData<>();

    public void initQuickLogin() {
        if (mQuickLogin == null) {
            mQuickLogin = QuickLogin.getInstance();
            mQuickLogin.init(App.getContext(), LoginConfig.MobileBusinessId);
        }
        // 没有预取号 || 预取号失败 || 取号时长不在两分钟内
        if (mModel == null || !mModel.isPrefetchResult() ||
                System.currentTimeMillis() - mPrefetchTime > 110000) {
            mQuickLogin.prefetchMobileNumber(new QuickLoginPreMobileListener() {
                /*
                 * 预取号成功
                 * @param YDToken      易盾Token
                 * @param mobile       获取的本机号码掩码
                 */
                @Override
                public void onGetMobileNumberSuccess(String YDToken, String mobile) {
                    if (BuildConfig.DEBUG) {
                        Log.d(TAG, "onGetMobileNumberSuccess: YDToken=" + YDToken +
                                ", mobile=" + mobile);
                    }
                    mPrefetchTime = System.currentTimeMillis();
                    mModel = new MobileLoginModel();
                    mModel.setToken(YDToken);
                    mModel.setMobile(mobile);
                    mModel.setPrefetchResult(true);
                    mPrefetchLive.postValue(mModel);
                }

                /*
                 * 预取号失败
                 * @param YDToken 易盾Token
                 * @param msg     获取本机号码掩码失败原因
                 */
                @Override
                public void onGetMobileNumberError(String YDToken, String msg) {
                    if (BuildConfig.DEBUG) {
                        Log.d(TAG, "onGetMobileNumberError: YDToken=" + YDToken +
                                ", msg=" + msg);
                    }
                    mModel = new MobileLoginModel();
                    mModel.setMsg(msg);
                    mModel.setToken(YDToken);
                    mModel.setPrefetchResult(false);
                    mPrefetchLive.postValue(mModel);
                }
            });
        } else {
            mPrefetchLive.postValue(mModel);
        }
    }

    public void onePass(QuickLoginTokenListener listener) {
        if (mQuickLogin == null) return;

        // 自定义授权界面
        UnifyUiConfig.Builder config = new UnifyUiConfig.Builder();
        // 1、状态栏
        // 设置状态栏背景颜色，Android 5.0 及以上生效
        config.setStatusBarColor(Color.WHITE)
                // 设置状态栏字体图标颜色是否为暗色(黑色)，暗色 Android6.0 及以上生效
                .setStatusBarDarkColor(true);
        // 2、导航栏（默认高度0）
        // 设置导航栏高度，单位 dp
        config.setNavigationHeight(50)
                // 设置导航栏返回按钮图标 Drawable 值
                .setNavigationIconDrawable(
                        ContextCompat.getDrawable(App.getContext(), R.mipmap.login_back))
                // 设置导航栏标题
                .setNavigationTitle("本机号码授权登录")
                // 设置导航栏标题颜色
                .setNavigationTitleColor(Color.BLACK);
        // 3、应用LOGO
        config.setLogoIconDrawable(
                        ContextCompat.getDrawable(App.getContext(), R.mipmap.ic_launcher_logo))
                // 设置应用logo宽度\高度，单位dp
                .setLogoWidth(77).setLogoHeight(77)
                // 设置登录按钮顶部Y轴偏移，单位 dp
                .setLogoTopYOffset(20);
        // 4、本机号码
        // 设置手机掩码颜色
        config.setMaskNumberColor(Color.BLACK)
                // 设置手机掩码字体大小，单位 sp
                .setMaskNumberSize(16);
        // 5、认证品牌
        // 设置认证品牌字体大小，单位 sp
        config.setSloganDpSize(14)
                // 设置认证品牌颜色
                .setSloganColor(Color.GRAY);
        // 6、登录按钮
        config.setLoginBtnText("授权登录")
                .setLoginBtnWidth(275).setLoginBtnHeight(40)
                .setLoginBtnTextSize(14)
                .setLoginBtnTextColor(Color.WHITE)
                .setLoginBtnBackgroundRes("login_btn");
        // 7、隐私协议
        // 设置隐私栏文本颜色，不包括协议
        config.setPrivacyTextColor(Color.parseColor("#888888"))
                // 设置隐私栏协议颜色
                .setPrivacyProtocolColor(
                        ContextCompat.getColor(App.getContext(), R.color.colorPrimary))
                // 设置隐私栏区域字体大小，单位 sp
                .setPrivacySize(11)
                // 设置隐私栏距离屏幕底部偏移，单位 dp
                .setPrivacyBottomYOffset(55)
                // 选择框
                .setCheckedImageDrawable(
                        ContextCompat.getDrawable(App.getContext(), R.mipmap.login_checkbox_sel))
                .setUnCheckedImageDrawable(
                        ContextCompat.getDrawable(App.getContext(), R.mipmap.login_checkbox_nor))
                // 设置隐私栏协议复选框勾选状态，true 勾选，false 不勾选
                .setPrivacyState(false);
        // 8、其他（自定义登录页背景图片）
//        config.setBackgroundImage("");
//        config.setBackgroundGif("");
        // 注意：调用该方法可实现对三网运营商授权页面个性化设计，
        // 每次调起拉取授权页方法前必须先调用该方法，否则授权界面会显示异常
        // 三网界面配置内部实现逻辑不同，请务必使用移动、电信、联通卡分别测试三网界面
        mQuickLogin.setUnifyUiConfig(config.build(App.getContext()));

        mQuickLogin.onePass(listener);
    }

    public void quitActivity() {
        if (mQuickLogin != null) mQuickLogin.quitActivity();
    }

    public void clearScripCache() {
        if (mQuickLogin != null)
            mQuickLogin.clearScripCache(App.getContext());
        mModel = null;
        mPrefetchLive.postValue(null);
    }

    public MutableLiveData<MobileLoginModel> getPrefetchLive() {
        return mPrefetchLive;
    }

    public MobileLoginModel getMobileLoginModel() {
        return mPrefetchLive.getValue();
    }
}
